package com.loong.android.tools;

import android.text.TextUtils;
import android.util.Xml;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.ByteArrayInputStream;
import java.io.IOException;

/**
 * 使用XmlPullParser解析XML数据
 */
public class XmlReader {
    /**
     * 使用Pull解析XML(其他还有DOM和SAX)
     * Pull是采用事件驱动方式来完成XML解析的。
     * 使用Pull解析XML时，会产生5种事件：
     * 1：START_DOCUMENT。表示开始读取XML文档；
     * 2：START_TAG。表示开始读取XML标签；
     * 3：TEXT。表示读取XML标签的内容；
     * 4：END_TAG。表示完成一个标签的读取；
     * 5：END_DOCUMENT。表示完成XML文档的读取。
     */

    private XmlPullParser mReadXml;

    /**
     * 返回操作的org.xmlpull.v1.XmlPullParser对象
     */
    public XmlPullParser getXmlPullParser() {
        return mReadXml;
    }

    /**
     * 通过XML文本，创建解析器
     * @param xml XML格式的文本
     * @param encoding 一般为"UTF-8" 或 "GBK"等，默认为"UTF-8"
     * @return 返回创建结果，true=成功; false=失败
     */
    public boolean build(String xml, String encoding) {
        if (TextUtils.isEmpty(xml) || TextUtils.isEmpty(encoding)) return false;
        mReadXml = Xml.newPullParser();
        try {
            mReadXml.setInput(new ByteArrayInputStream(xml.getBytes()), encoding);
            return true;
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 通过XML文本，创建解析器
     * @param xml XML格式的文本
     * @return 返回创建结果，true=成功; false=失败
     */
    public boolean build(String xml) {
        return build(xml, "UTF-8");
    }

    /**
     * 获取当前解析过程的事件类型，参考EventType类的常量
     * @return 返回事件类型值，若失败返回-1
     */
    public int getEventType() {
        if (mReadXml == null) return -1;
        try {
            return mReadXml.getEventType();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
        return -1;
    }

    /**
     * 往下解析，得到下一个解析事件，失败返回-1
     */
    public int next() {
        if (mReadXml == null) return -1;
        try {
            return mReadXml.next();
        } catch (XmlPullParserException | IOException e) {
            e.printStackTrace();
        }
        return -1;
    }

    /**
     * 跳过文本内容，直接跳到当前标签的结尾或下一个标签的开头
     */
    public void nextTag() {
        try {
            mReadXml.nextTag();
        } catch (XmlPullParserException | IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 跳到下个文本
     */
    public String nextText() {
        try {
            return mReadXml.nextText();
        } catch (XmlPullParserException | IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    public int nextToken() {
        try {
            return mReadXml.nextToken();
        } catch (XmlPullParserException | IOException e) {
            e.printStackTrace();
        }
        return -1;
    }

    /**
     * 取标签的文本内容
     */
    public String getText() {
        return mReadXml.getText();
    }

    /**
     * 取当前标签的名称
     */
    public String getName() {
        return mReadXml.getName();
    }

    /**
     * 取命名空间
     */
    public String getNamespace() {
        return mReadXml.getNamespace();
    }

    /**
     * 取命名空间
     * @param prefix 前缀
     */
    public String getNamespace(String prefix) {
        return mReadXml.getNamespace(prefix);
    }

    /**
     * 取命名空间前缀
     * @param pos 位置
     */
    public String getNamespacePrefix(int pos) {
        try {
            return mReadXml.getNamespacePrefix(pos);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 取命名空间Uri
     * @param pos 位置
     */
    public String getNamespaceUri(int pos) {
        try {
            return mReadXml.getNamespaceUri(pos);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 取位置描述
     */
    public String getPositionDescription() {
        return mReadXml.getPositionDescription();
    }

    /**
     * 取前缀
     */
    public String getPrefix() {
        return mReadXml.getPrefix();
    }

    /**
     * 取行号
     */
    public int getLineNumber() {
        return mReadXml.getLineNumber();
    }

    /**
     * 取列号
     */
    public int getColumnNumber() {
        return mReadXml.getColumnNumber();
    }

    /**
     * 取特征
     * @param name 名称
     */
    public boolean getFeature(String name) {
        return mReadXml.getFeature(name);
    }

    /**
     * 取深度
     */
    public int getDepth() {
        return mReadXml.getDepth();
    }

    /**
     * 取属性对象
     * @param name 名称
     */
    public Object getProperty(String name) {
        return mReadXml.getProperty(name);
    }

    /**
     * 取输入编码
     */
    public String getInputEncoding() {
        return mReadXml.getInputEncoding();
    }

    /**
     * 取命名空间数量
     * @param depth 深度
     */
    public int getNamespaceCount(int depth) {
        try {
            return mReadXml.getNamespaceCount(depth);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 取属性数量
     */
    public int getAttributeCount() {
        if (mReadXml == null) return 0;
        return mReadXml.getAttributeCount();
    }

    /**
     * 取属性名称
     * @param index 索引
     */
    public String getAttributeName(int index) {
        return mReadXml.getAttributeName(index);
    }

    /**
     * 取属性命名空间
     * @param index 索引
     */
    public String getAttributeNamespace(int index) {
        return mReadXml.getAttributeNamespace(index);
    }

    /**
     * 取属性类型
     * @param index 索引
     */
    public String getAttributeType(int index) {
        return mReadXml.getAttributeType(index);
    }

    /**
     * 取属性前缀
     * @param index 索引
     */
    public String getAttributePrefix(int index) {
        return mReadXml.getAttributePrefix(index);
    }

    /**
     * 取属性值
     * @param index 索引
     */
    public String getAttributeValue(int index) {
        return mReadXml.getAttributeValue(index);
    }

    /**
     * 取属性值
     * @param namespace 命名空间，若无则传入null
     * @param name 属性名称
     */
    public String getAttributeValue(String namespace, String name) {
        return mReadXml.getAttributeValue(namespace, name);
    }

    /**
     * 是否为空标签
     */
    public boolean isEmptyElementTag() {
        try {
            return mReadXml.isEmptyElementTag();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 是否为空白字符
     */
    public boolean isWhitespace() {
        try {
            return mReadXml.isWhitespace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
        return false;
    }

    public boolean isAttributeDefault(int index) {
        return mReadXml.isAttributeDefault(index);
    }


    /**
     * 解析事件类型
     */
    public static class EventType {
        //文档开始
        public final static int START_DOCUMENT = XmlPullParser.START_DOCUMENT;
        //文档结束
        public final static int END_DOCUMENT = XmlPullParser.END_DOCUMENT;
        //标签开始
        public final static int START_TAG = XmlPullParser.START_TAG;
        //标签结束
        public final static int END_TAG = XmlPullParser.END_TAG;
        //读取文本
        public final static int TEXT = XmlPullParser.TEXT;
        public final static int CDSECT = XmlPullParser.CDSECT;
        public final static int ENTITY_REF = XmlPullParser.ENTITY_REF;
        public final static int IGNORABLE_WHITESPACE = XmlPullParser.IGNORABLE_WHITESPACE;
        public final static int PROCESSING_INSTRUCTION = XmlPullParser.PROCESSING_INSTRUCTION;
        //读取注释
        public final static int COMMENT = XmlPullParser.COMMENT;
        //读取注释
        public final static int DOCDECL = XmlPullParser.DOCDECL;
    }

}
